這是這個系列的第一篇文章,將簡短介紹系列文,與 Objective-C 的簡介。
Photo by @dtopkin1 on Unsplash
你好,謝謝你想閱讀這個系列文章,這個系列文章我個人認定是中等難度的,建議是具有基本的物件導向程式設計能力或是具有 Swift 語言基礎的人閱讀。文末有相關的簡單測試,可以快速了解目前的自己適不適合了解這個主題,如果你回答不出來,別擔心,可以留言試著解答,說不定你其實已經知道了。
2019 年以前,由於 Swift 尚未達成 ABI 穩定,所以有許多公司在專案上的語言選擇上,會因為 Swift System 的 API 不穩定,為了避免產品在不同 iOS 版本之間有巨大的適應落差,因此會相對選擇歷史相對悠久的 Objective-C。今年( 2020 年) 是 Swift 迎來 ABI 穩定的第二年,市場上漸漸認同了 Swift 語言的價值,願意開始以 Swift 作為主要開發語言。根據 Stack Overflow 在 2020 年的 [ Developer Survey ] 中: Swift / Objective-C 的喜愛比率分別有 59.5 / 23.4%,恐懼比率則分別是40.5 / 76.6% 真實反應了全世界的開發者對於 這兩個語言的偏好。但是由於 Objective-C 學習資源的日漸短少,相關人才也越來越稀缺,Objective-C 的平均薪水足足高於 Swift 10 個百分點(世界範圍)。目前有不少資深的開發者強調想把 Objective-C 的舊有程式改寫成 Swift,這樣的想法成為了這次的鐵人賽選擇這個主題的原因:
透過在 Swift 開發經驗,了解 Objective-C 的語言文法、中心思想及適應 Swift 的方法。
我希望能在 30 天內使讀者了解 Objective-C 的閱讀、理解、改寫,並能夠進一步的具備能為現有 Objective-C 程式碼提供 Swift friendly 的能力。
我是游諭,一位 iOS 的開發者,具備 C 語言、Swift 語言、bash 語言、 Makefile 語言能力,2018 年完成 School 42 Fremont Piscine C,獨立 app 開發經驗,對於物件導向程式設計與設計模式略有涉略,喜歡 Functional 程式設計。
文章共區分 3 個大章節:
以下是我目前找到不錯的學習資源
Objective-C 的名字中 Objective 很直接的告訴我們,她的本質還是 C 語言,也因此我們可以理解以下 Objective-C 的開發背景。
C 語言在 1970 年代初期,由 Dennis Ritchie 與 Ken Thompson 在美國 Nokia Bell Labs 開發出來。當初 C 語言面世之前,程式主要以組合語言作為編寫的方式,需要針對執行機器編寫,造成程式必須在指定的電腦上執行的問題。而 C 語言透過定義型別、可移植編譯器,大大的解除了指定電腦的限制,也因此有了高階語言的區分。隨著 C 語言的便利,越來越多公司開始使用 C 語言作為開發主力,而在 1989 年美國國家標準協會將 C 語言標準化,奠定了 C 語言在 20 世紀的樣貌。
而物件導向是沒有在 C 語言出現的。物件導向程式設計早在 1960 年代出現,當時的程式設計面臨軟體維護的危機,為了解決這個在軟硬體逐漸複雜的環境變化,1970 年代便出現了 Smalltalk 語言,奠定了物件導向語言的基礎。
當我們提到物件導向的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。 wiki - 物件導向程式設計
Objective-C 是由 Tom Love 與 Brad Cox 與 1980 年代發表,當時 並不屬於 Apple 公司而是 Productivity Products International。關於當初 Love 與 Cox 設計 Objective-C 的理念,建議可以閱讀由 brad Cox 的書籍 《Object-Oriented Programming, An Evolutionary Approach 》
Object-Oriented Programming, An Evolutionary Approach 封面
1988 年 Steve Jobs 成立 NeXT 公司並買下 Objective-C 的授權,並研發 NeXTSTEP 作業系統作為產品,後續 Apple 收購 NeXT 並使 NeXTSTEP 成為 OS X 的基礎,後來成為 現在所知道的 Cocoa。
下一篇文章介紹 Objective-C 與 C 語言的關係,說明 C 語言在 Objective-C 的地位。
歡迎留言你的答案,或是與已經有留言的網友互動 ?。
你好,我是Alvin
感謝回答,我針對你的答案我覺得沒有回答問題的部分
重覆留言請忽略
------頂層-------
system:命令列參數與環境變數
heap:動態配置變數
stack:區域變數
bss:未初始化靜態變數
data:初始化靜態變數
text:程式碼,這裡存放的是可執行的 CPU 指令
------底層-------
3.物件導向的三大特性
封裝,繼承,多型
封裝:封裝使物件的設計者與物件的使用者分開,使用者只要知道物件可以做什麼就可以了,不需要知道具體是怎麼實現的。
繼承:建立一個新的派生類,從一個或多個先前定義的類中繼承資料和函式,可以重新定義或加進新資料和函式,從而建立了類的層次或等級。
多型:同一操作作用與不同類的例項,將產生不同的執行結果,即不同類的物件收到相同的訊息時,將得到不同的結果。
4. 每個物件中的函式是獨一無二的
4函式是獨一無二的
如果你函式有相同的 那妳何不刪掉重複的函式?
tony781124
在物件生成後,函式要如何被刪除了?
照我的推測,你說的是型別
的函式,在程式設計階段(編譯前)將重複的函式從原始碼移除。
而我的問題以 Swift 來示範是這樣的
class ObjectType {
func aFunction() {}
}
let objectNo1 = ObjectType()
let objectNo2 = ObjectType()
objectNo1.aFunction !== objectNo2.aFunction // 這行無法編譯的
請問 objectNo1.aFunction 與 objectNo2.aFunction 是不是同一個 referance
關於第 4 題的提醒:
物件是由型別生成的,每個物件可以用自己的 reference,而物件的型別是獨一無二的。
Swift 示範問題
class ObjectType {
func aFunction() {}
}
let objectNo1 = ObjectType()
let objectNo2 = ObjectType()
objectNo1.aFunction !== objectNo2.aFunction // 這行無法編譯的
請問 objectNo1.aFunction 與 objectNo2.aFunction 是不是同一個 referance
來源同一個referance,但實作之後是不同個體無法相等
不太懂你不是獨一無二的點在哪?就像雙胞胎來自同一對染色體,但還是不同的個體,所以人是獨一無二的
在 Swift 中,objectNo1.aFunction()
語法可以等價於 ObjectType.AFunction(objectNo1)
。
在 Python 中,編寫物件的function時,第一個參數是 self。
在 Python 3.9 的文件中,9.3.4 章節有提到
In our example, the call x.f() is exactly equivalent to MyClass.f(x).
我得到的想法是參考這一段,對我來說很合理,物件的 Function 是共用的而非每個物件擁有各自的Function,你覺得呢?